/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SensorDataDesktop;

import Alertas.FabricaDeAlerta;
import Entidades.Equipo;
import Entidades.Medicion;
import Entidades.Subscripcionfuncionamiento;
import Persistencia.FachadaPersistencia;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Luis
 */
public class Funcionamiento extends Thread {

    public void run() {
        while (true) {
            ArrayList<Subscripcionfuncionamiento> subscripciones = FachadaPersistencia.getInstancia().buscarSubscripcionesFuncionamiento();
            ArrayList<Equipo> equipos = agragarEquiposNotificar(subscripciones);
            ArrayList<Equipo> equiposNotificar = new ArrayList<>();
            if (!equipos.isEmpty()) {
                for (int i = 0; i < equipos.size(); i++) {
                    if (verificarFuncionamiento(equipos.get(i))) {
                        equiposNotificar.add(equipos.get(i));
                    }
                }
                if (!equiposNotificar.isEmpty()) {
                    FabricaDeAlerta.getInstancia().getAlerta("Funcionamiento").enviarAlerta(equiposNotificar, subscripciones);
                }
            }
            try {
                sleep(30000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Funcionamiento.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public boolean verificarFuncionamiento(Equipo _equipo) {
        Medicion medicion = _equipo.getUltimaMedicion();
        if (medicion != null) {
            Timestamp actual = new Timestamp(new Date().getTime());
            Timestamp tiempo = new Timestamp(actual.getTime() - _equipo.getTiempoSinEnviarDatos().getTime());
            tiempo.setHours(tiempo.getHours() + 3);
            if (!(medicion.getFecha().getTime() >= tiempo.getTime() && medicion.getFecha().getTime() <= actual.getTime())) {
                return true;
            }
            return false;
        } else {
            return false;
        }

    }

    public ArrayList<Equipo> agragarEquiposNotificar(ArrayList<Subscripcionfuncionamiento> _sub) {
        ArrayList<Equipo> equipos = new ArrayList<>();
        for (int i = 0; i < _sub.size(); i++) {
            if (!equipos.contains(_sub.get(i).getSdSensorEquipo())) {
                equipos.add(_sub.get(i).getSdSensorEquipo());
            }
        }
        return equipos;
    }
}